
#ifndef PAC_GAME_H
#define	PAC_GAME_H

#include "lc_array.h"
#include "pac_ghost.h"
#include "pac_game.h"
#include "pac_object.h"

typedef struct PacGame PacGame;

struct PacGame {
    // Nombre de fantômes mangés depuis la dernière powerBall
    int eatenGhostCount;

    // Score courant du joueur
    int playerScore;

    // Nombre de vie restante
    int playerLifeCount;

    // Liste de tous les niveaux
    LCarray* levelsList;

    // Niveau courant
    PacLevel* currentLevel;

    // indice du nivau courant
    int currentLevelIndex;

    // Nombre de seconde restante d'activation des pouvoirs
    int powerBallPowerTime;

    // Booleen indiquant si le jeu est en pause
    boolean gameIsPaused;

    // Booleen indiquant si c'est une pause temporaire
    boolean gameWillAutoUnpause;

    // Booleen indiquant si la partie est gagnée
    boolean gameIsWon;

    // Booleen indiquant si la partie est perdue
    boolean gameIsOver;

    // Booleen indiquant si la partie est démarrée
    boolean gameIsStarted;

    // Nombre de millisecondes de pause
    int gamePauseTime;
    
    // Booléen indiquant si le jeu est en mode FPS
    boolean isFPSMode;
    
    // Angle courant de la caméra pour le mode FPS
    int cameraAngle;
    
    // Angle de la caméra à ateindre pour le mode FPS.
    int cameraAngleTarget;
    
    // Facteur de déplacemement de la caméra pour le mode FPS.
    int cameraAngleDelta;
    
    // Booléen indiquant si le son de fin de pouvoir a déjà été joué.
    boolean endOfPowerSoundPlayed;
};



PacGame* createGame(LCarray* aLevelList);

void freePacGame(PacGame * aPacGame);

void processWin(PacGame* aPacGame);

void processGameOver(PacGame* aPacGame);

void pauseGame(PacGame * aPacGame);

void unpauseGame(PacGame * aPacGame);

void updatePauseStatus(PacGame * aPacGame);

void pauseGameDuring(PacGame * aPacGame, int aSecondCount);

void restartLevel(PacGame* aPacGame);

void swapToNextLevel(PacGame* aPacGame);

void addValueToScore(PacGame* aPacGame, int aValue);

void processPacmanLostFight(PacGame* aPacGame);

void processGhostLostFight(PacGame* aPacGame, PacGhost * aGhost);

void processPacFight(PacGame* aPacGame, PacObject * aPacMan, PacGhost * aGhost);

void checkIfLevelIsTerminated(PacGame* aPacGame);

void processPacGumEating(PacGame* aPacGame, PacObject * aPacMan);

void processPowerBallEating(PacGame* aPacGame, PacObject * aPacMan);

void applyCaseChangementForPacman(PacGame* aPacGame, PacObject * aPacMan);

void applyCaseChangementForGhost(PacGame* aPacGame, PacGhost * aGhost);

void movePacMan(PacGame* aPacGame, PacObject * aPacMan);

void movePacManLoop(PacGame* aPacGame);

void moveGhost(PacGame* aPacGame, PacGhost * aGhost);

void moveGhostsLoop(PacGame* aPacGame);

void changePacmanDirection(PacGame* aPacGame, int aDirection);

void processGameStep(PacGame * aPacGame);



#endif	/* PAC_GAME_H */

